package quanlyhochieu.giaohc;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import quanlydoanra.utils.truyXuatDatabase;
import quanlyhochieu.taomoi.utils;
import utils.DateUtils;
import dbutil.ConnectDB;
import exportPDF.ExporToPDF;

public class ThongTinHC {
	private String error;
	private String soHC;
	private String ten;
	private String maDoan;
	private String gioiTinh;
	private String namSinh;
	private String coQuan;
	private String loaiHC;
	private String noiCap;
	private String ngayCap;
	private String ngayHetHan;
	private java.util.Date ngayThucHien = new java.util.Date();
	private String nuocDen;
	private java.util.Date ngayDi;
	private java.util.Date ngayVe;
	private String strNgayDi;
	private String strNgayVe;
	private String soQD;
	private String thaoTac;
	private boolean nopHC;
	private boolean state;
	private String chuThich;
	private String pathDownload;
	private String linkdownload;
	private List<HienThiThongTin> listData;
	
	
	public List<HienThiThongTin> getListData() {
		return listData;
	}

	public void setListData(List<HienThiThongTin> listData) {
		this.listData = listData;
	}

	public String getPathDownload() {
		return pathDownload;
	}

	public void setPathDownload(String pathDownload) {
		this.pathDownload = pathDownload;
	}

	public String getChuThich() {
		return chuThich;
	}

	public void setChuThich(String chuThich) {
		this.chuThich = chuThich;
	}

	public boolean isState() {
		return state;
	}

	public void setState(boolean state) {
		this.state = state;
	}

	public boolean isNopHC() {
		return nopHC;
	}

	public void setNopHC(boolean nopHC) {
		this.nopHC = nopHC;
	}

	public ThongTinHC(){}

	public String getSoHC() {
		return soHC;
	}

	public void setSoHC(String soHC) {
		this.soHC = soHC;
	}

	public String getTen() {
		return ten;
	}

	public void setTen(String ten) {
		this.ten = ten;
	}

	public String getGioiTinh() {
		return gioiTinh;
	}

	public void setGioiTinh(String gioiTinh) {
		this.gioiTinh = gioiTinh;
	}

	public String getNamSinh() {
		return namSinh;
	}

	public void setNamSinh(String namSinh) {
		this.namSinh = namSinh;
	}

	public String getCoQuan() {
		return coQuan;
	}

	public void setCoQuan(String coQuan) {
		this.coQuan = coQuan;
	}

	public String getLoaiHC() {
		return loaiHC;
	}

	public void setLoaiHC(String loaiHC) {
		this.loaiHC = loaiHC;
	}

	public String getNoiCap() {
		return noiCap;
	}

	public void setNoiCap(String noiCap) {
		this.noiCap = noiCap;
	}

	public String getNgayCap() {
		return ngayCap;
	}

	public void setNgayCap(String ngayCap) {
		this.ngayCap = ngayCap;
	}

	public String getNgayHetHan() {
		return ngayHetHan;
	}

	public void setNgayHetHan(String ngayHetHan) {
		this.ngayHetHan = ngayHetHan;
	}

	public java.util.Date getNgayThucHien() {
		return ngayThucHien;
	}

	public void setNgayThucHien(java.util.Date ngayThucHien) {
		this.ngayThucHien = ngayThucHien;
	}

	public String getNuocDen() {
		return nuocDen;
	}

	public void setNuocDen(String nuocDen) {
		this.nuocDen = nuocDen;
	}

	public java.util.Date getNgayDi() {
		return ngayDi;
	}

	public void setNgayDi(java.util.Date ngayDi) {
		this.ngayDi = ngayDi;
	}

	public java.util.Date getNgayVe() {
		return ngayVe;
	}

	public void setNgayVe(java.util.Date ngayVe) {
		this.ngayVe = ngayVe;
	}

	public String getSoQD() {
		return soQD;
	}

	public void setSoQD(String soQD) {
		this.soQD = soQD;
	}

	public String getThaoTac() {
		return thaoTac;
	}

	public void setThaoTac(String thaoTac) {
		this.thaoTac = thaoTac;
	}

	public String getError() {
		return error;
	}

	public void setError(String error) {
		this.error = error;
	}
	public void resetDataHoChieu(){
		this.ten = null;
		this.gioiTinh = null;
		this.namSinh = null;
		this.coQuan = null;
		this.loaiHC = null;
		this.ngayCap = null;
		this.ngayHetHan = null;
		this.noiCap = null;
		
	}
	public void resetDataQuyetDinh(){
		this.ngayThucHien = new java.util.Date();
		this.ngayDi =null;
		this.ngayVe = null;
		this.nuocDen = null;
		this.nopHC =false;
	}
	/**************************************
	 * Method name		: getInfor
	 * Return type		: String
	 * Description		:
	 * Created date		: Aug 21, 2008
	 * Author			: Ngoc Diem
	 **************************************/
	public String getInfor(){
		try{
		String SQL = "SELECT * FROM hochieu as HC, canhan as CN where HC.cmnd = CN.cmnd and HC.sohc = '"+this.soHC.trim()+"'";
		ArrayList array = ConnectDB.getDataTypeList(SQL);
			if (array.size() > 0) {
			HashMap<String, Object> hash = new HashMap<String, Object>();
			for (int i = 0; i < array.size(); i++) {
				hash = (HashMap<String, Object>) array.get(i);
				this.setTen(hash.get("ten").toString());
				boolean bool = Boolean.parseBoolean(hash.get("gioitinh").toString());
				if(bool == true) this.setGioiTinh("Nam");
				else this.setGioiTinh("Nữ");
				this.setNamSinh(hash.get("namsinh").toString());
				this.setCoQuan(hash.get("coquan").toString());
				this.setLoaiHC(hash.get("loaihc").toString());
				this.setNoiCap(hash.get("noicap").toString());
				String strNgayCap = hash.get("ngaycap").toString();
				this.setNgayCap(DateUtils.formatDate(strNgayCap));
				String strNgayHetHan = hash.get("ngayhethan").toString();
				this.setNgayHetHan(DateUtils.formatDate(strNgayHetHan));
				this.setError("");
			}
			if(this.checkHoChieuTrongViTriLuuTru() == true){
				this.setError("Hộ chiếu này đang được giao cho người sử dụng");
					if(this.soNgayTreHan(this.soHC)!= 0L){
						this.setError("Hộ chiếu đang được giao và trễ hạn "+this.soNgayTreHan(this.soHC)+"ngày");
						}
			}
			}
			else {
				this.setError("Số hộ chiếu không đúng. Yêu cầu nhập lại");
				this.resetDataHoChieu();
			}
			
			
		}
		catch(Exception ex){
			System.out.println("Loi");
		}
			
		return "giao_hochieu";
	}
	
	public boolean checkQD(){
		boolean result = false;
		String SQL = "SELECT * FROM quyetdinh as QD, doanra as DR where QD.id = DR.idquyetdinh and QD.soqd = '"+this.soQD.trim()+"'";

		ArrayList array = ConnectDB.getDataTypeList(SQL);
			if (array.size() > 0) {
		result = true;
			}
			return result;
	}

	/**************************************
	 * Method name		: thongTinThaoTac
	 * Return type		: String
	 * Description		:
	 * Created date		: Aug 21, 2008
	 * Author			: Ngoc Diem
	 **************************************/
	public String thongTinThaoTac(){
		try{
			String SQL = "SELECT * FROM quyetdinh as QD, doanra as DR where QD.id = DR.idquyetdinh and QD.soqd = '"+this.soQD.trim()+"'";
			System.out.println("SQL quyet dinh "+SQL);
			ArrayList array = ConnectDB.getDataTypeList(SQL);
				if (array.size() > 0) {
				HashMap<String, Object> hash = new HashMap<String, Object>();
				for (int i = 0; i < array.size(); i++) {
					hash = (HashMap<String, Object>) array.get(i);
					this.strNgayDi = hash.get("ngaydi").toString();
					this.strNgayVe = hash.get("ngayve").toString();
					this.setNgayDi(java.sql.Date.valueOf(this.strNgayDi));
					this.setNgayVe(java.sql.Date.valueOf(this.strNgayVe));
					this.setNuocDen(hash.get("nuocden").toString());
					this.setMaDoan(hash.get("madoan").toString());
					this.setError("");
				}
				}
				else{
					this.setError("Số QĐ không đúng. Yêu cầu nhập lại");
					this.resetDataQuyetDinh();
				}
				
				
		}
		catch(Exception ex){
			System.out.println("Loi");
		}
		return "giao_hochieu";
	}
	/**************************************
	 * Method name		: checkHoChieuTrongViTriLuuTru
	 * Return type		: boolean
	 * Description		:
	 * Created date		: Aug 21, 2008
	 * Author			: Ngoc Diem
	 **************************************/
	public boolean checkHoChieuTrongViTriLuuTru(){
		boolean result = false;
		String sql = "select * from vitriluutru where sohc = '"+this.soHC+"' and trangthainhan = 'G'";
		ArrayList array = ConnectDB.getDataTypeList(sql);
		if(array.size()>0){//HC nay dang dc giao
			result = true;
		}
		else result = false;
		
		return result;
		
	}
	/**************************************
	 * Method name		: checkValueGiaoHC
	 * Return type		: boolean
	 * Description		:
	 * Created date		: Aug 21, 2008
	 * Author			: Ngoc Diem
	 **************************************/
	public boolean checkValueGiaoHC(){
		boolean result = false;
		if(this.soHC == null || this.soHC.equals("")){
			this.setError("Bạn phải nhập vào số hộ chiếu");
			result = false;
			}
		else if(truyXuatDatabase.kiemTraSoHC(this.soHC) == false){
			this.setError("Số hộ chiếu không tồn tại");
			result = false;
		}
		else if(this.soHC != null && ! this.soHC.equals("") && this.checkHoChieuTrongViTriLuuTru() == true){
			this.setError("Hộ chiếu này đang được giao cho người sử dụng");
			result = false;
			
		}
		else if(this.soQD == null || this.soQD.equals("") ||	
				this.ngayThucHien == null || this.ngayThucHien.equals("")){
			this.setError("Bạn phải nhập đầy đủ thông tin có dấu(*)");
			result = false;
		}
		else if(this.soQD != null && !this.soQD.equals("") && this.checkQD() == false){
			this.setError("Số QĐ không đúng. Yêu cầu nhập lại");
			result = false;
		}
		else {
			this.setError("");
			this.chuThich =this.ten+" đã đi đến "+this.nuocDen+" trong thời gian "+this.ngayDi+"_"+this.ngayVe; 
			result = true;
		}
		
		return result;
	}
	/**************************************
	 * Method name		: getMaDoanTuongUngVoiSoHC
	 * Return type		: String
	 * Description		:
	 * Created date		: Aug 21, 2008
	 * Author			: Ngoc Diem
	 **************************************/
	public String getMaDoanTuongUngVoiSoHC(String soHC){
		String strMaDoan = "";
		String sql = "select * from nhatkytranhanhc where sohc = '"+soHC+"' order by ngaythaotac";
		ArrayList array = ConnectDB.getDataTypeList(sql);
		if (array.size() > 0) {
		HashMap<String, Object> hash = new HashMap<String, Object>();
		hash = (HashMap<String, Object>) array.get(array.size() - 1);
		String thaotac = hash.get("thaotac").toString();
		strMaDoan = hash.get("madoan").toString();
		}
		return strMaDoan; 
	}

	/**************************************
	 * Method name		: soNgayTreHan
	 * Return type		: Long
	 * Description		:
	 * Created date		: Sep 5, 2008
	 * Author			: Ngoc Diem
	 **************************************/
	public Long soNgayTreHan(String soHC){
		String sql = "select *  from vitriluutru as VTLL, nhatkytranhanhc as NK, dsnguoidi as DS, doanra as DR, canhan as CN where VTLL.trangthainhan = 'G' and VTLL.trangthainhan = NK.thaotac and VTLL.sohc = NK.sohc and DS.sohc = VTLL.sohc and DS.sohc = NK.sohc and DR.madoan = DS.iddoanra and CN.cmnd = DS.cmnd and DS.sohc = '"+soHC+"'" ;
		ArrayList<HashMap<String, Object>> array = ConnectDB.getDataTypeList(sql);
		Long dayBefor = null;
		if (array.size() > 0) {
			HashMap<String, Object> hash = new HashMap<String, Object>();		
			for (int i = 0; i < array.size(); i++) {
				hash = (HashMap<String, Object>) array.get(i);
					String ngayve =  hash.get("ngayve").toString();
					String strNgayHetHan = DateUtils.layNgayHetHan(ngayve);
					System.out.println("ngay tre han "+strNgayHetHan);
					java.sql.Date dateHetHan = java.sql.Date.valueOf(strNgayHetHan);
					dayBefor = DateUtils.daysBetween(new java.util.Date(),DateUtils.sqlDateToutilDate(dateHetHan));
					if(dayBefor < 0){
						//ngay hien tai lon hon ngay het han
						//luc nay nguoi nay da vi pham
					dayBefor = (-1)* dayBefor;
					}
					else dayBefor = 0L;
			}
		}
		return dayBefor;
		
	}
	/**************************************
	 * Method name		: checkValueNhanHC
	 * Return type		: boolean
	 * Description		:
	 * Created date		: Aug 21, 2008
	 * Author			: Ngoc Diem
	 **************************************/
	public boolean checkValueNhanHC(){
		boolean result = false;
		if(this.soHC == null || this.soHC.equals("")){
			this.setError("Bạn phải nhập vào số hộ chiếu");
			result = false;
			}
		else if(truyXuatDatabase.kiemTraSoHC(this.soHC) == false){
			this.setError("Số hộ chiếu không tồn tại");
			result = false;
		}
		else if(this.soHC != null && ! this.soHC.equals("") && this.checkHoChieuTrongViTriLuuTru() == false){
			this.setError("Hộ chiếu này chưa được giao cho người sử dụng");
			result = false;
		}
		else if(this.soNgayTreHan(this.soHC)!= 0L){
			this.setError("Hộ chiếu này trễ hạn "+this.soNgayTreHan(this.soHC)+"ngày");
			this.chuThich="Hộ chiếu này trễ hạn "+this.soNgayTreHan(this.soHC)+"ngày";
			result = true;
		}
		else if(this.nopHC == false){
			this.setError("Bạn phải check vào nộp hộ chiếu!");
			result = false;
		}
		else {
			this.setError("");
			this.chuThich = "Thành viên "+this.ten+" đã trả hộ chiếu đúng hạn";
			result = true;
		}
		
		return result;
	}
	public String layMaDoanTuSoHC(String soHC){
		String result =null;
		String getMaxDate = "(select max(ngaythaotac)as maxdate from nhatkytranhanhc where sohc = '"+soHC+"')";
		System.out.println(getMaxDate);
		ArrayList<HashMap<String, Object>> array = ConnectDB.getDataTypeList(getMaxDate);
		String maxDate ="";
		if (array.size() > 0) {
			HashMap<String, Object> hash = new HashMap<String, Object>();
			for (int i = 0; i < array.size(); i++) {	
				hash = (HashMap<String, Object>) array.get(i);
				maxDate = hash.get("maxdate")== null?"":hash.get("maxdate").toString();
				System.out.println("date "+maxDate);
			}
		}
		if(maxDate != null || (! maxDate.equals(""))){
		String sql ="select * from nhatkytranhanhc where sohc = '"+soHC+"' and ngaythaotac = '"+maxDate+"'";
		System.out.println(sql);
		ArrayList<HashMap<String, Object>> array1 = ConnectDB.getDataTypeList(sql);
		if (array1.size() > 0) {
			HashMap<String, Object> hash1 = new HashMap<String, Object>();
			for (int i = 0; i < array1.size(); i++) {	
			hash1 = (HashMap<String, Object>) array1.get(i);
			result = hash1.get("madoan").toString();
		}
		}
		}
		
		return result;
	}
	
	/**************************************
	 * Method name		: thucHien
	 * Return type		: String
	 * Description		:
	 * Created date		: Aug 21, 2008
	 * Author			: Ngoc DIem
	 **************************************/
	public String thucHien(){
		//Buoc 1: insert vao trong bang log
		//Buoc 2: xet thao tac :
			//+ Giao ho chieu cho nguoi dung 
				//Kiem tra xem ho chieu nay co trong kho ko
						//Neu khong xuat thong bao
						//Neu co thi set lai trang thai cua vitriluutru la Giao
									//Va xuat bien nhan
			//+ Nhan ve ho chieu tu nguoi dung: xuat bien nhan theo mau
				//Kiem tra xem ho chieu nay dang o trang thai Giao hay Nhan
						//Set lai trang thai cua ho chieu trong vitriluutru la N
						//Xuat bien nhan	
		if(this.thaoTac != null && !this.thaoTac.equals("")){
			if(this.thaoTac.equals("G")){
				if(this.checkValueGiaoHC()){
					String sql =" insert into nhatkytranhanhc(sohc,madoan,thaotac,ngaythaotac) values('"+this.soHC+"','"+this.maDoan+"','G','"+this.ngayThucHien+"')";
					String sqlUpdateViTriLuuTru = "update vitriluutru set trangthainhan = 'G' where sohc = '"+this.soHC+"'";
					String sqlBienNhan = "insert into biennhan(nguoinhanhc,sohc,ngaynhanhc,trangthaitranhan,chuthich) values('"+this.ten+"','"+this.soHC+"','"+this.ngayThucHien+"','G','"+this.chuThich+"')";
					if(utils.insertData(sql) == 1 && utils.capNhatData(sqlUpdateViTriLuuTru)){
						this.setError("Hộ chiếu "+this.soHC+" đã được giao");
						utils.insertData(sqlBienNhan);
						this.exportPDFGiaoHC();
						this.resetDataHoChieu();
						this.resetDataQuyetDinh();
						
					}
					else {
						this.setError("Thao tác giao hộ chiếu đã bị lỗi. Yêu cầu kiểm tra thông tin");
					}
				}
			}
			else {
				if(this.checkValueNhanHC()){
					this.maDoan = this.layMaDoanTuSoHC(this.soHC);
					String sql =" insert into nhatkytranhanhc(sohc,madoan,thaotac,ngaythaotac) values('"+this.soHC+"','"+this.maDoan+"','N','"+this.ngayThucHien+"')";
					String sqlBienNhan = "insert into biennhan(nguoinhanhc,sohc,ngaynhanhc,trangthaitranhan,chuthich) values('"+this.ten+"','"+this.soHC+"','"+this.ngayThucHien+"','N','"+this.chuThich+"')";
					String sqlUpdateViTriLuuTru = "update vitriluutru set trangthainhan = 'N' where sohc = '"+this.soHC+"'";
					System.out.println(sql);
					if(utils.insertData(sql) == 1 && utils.capNhatData(sqlUpdateViTriLuuTru)){
						this.setError("Hộ chiếu "+this.soHC+" đã được nhận");
						utils.insertData(sqlBienNhan);
						this.exportPDFNhanHC();
						this.resetDataHoChieu();
						this.resetDataQuyetDinh();	
					}
					else {
						this.setError("Thao tác nhận hộ chiếu đã bị lỗi. Yêu cầu kiểm tra thông tin");
					}
				}
			}
		}
		else {
			this.setError("Bạn phải chọn thao tác xử lý");
		}
		
		return "giao_hochieu_xuatreport";
	}
	public String FillData(){
		List<HienThiThongTin> list = new ArrayList<HienThiThongTin>();
		String SQL = "select * from test";
		System.out.println(SQL);
		ArrayList<HashMap<String, Object>> array = ConnectDB
				.getDataTypeList(SQL);
		try {
			if (array.size() > 0) {
				HashMap<String, Object> hash = new HashMap<String, Object>();
				int stt = 0;
				for (int i = 0; i < array.size(); i++) {
					stt = i + 1;
					hash = (HashMap<String, Object>) array.get(i);
					HienThiThongTin h = new  HienThiThongTin();
					h.setStt(stt);
					String name = hash.get("name").toString();
					name = this.ten;
					h.setName(name);
					list.add(h);
				}
			}else{
				list = new ArrayList<HienThiThongTin>();
			}
			this.setListData(list);
		
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return "";
		
		
	}
	/**************************************
	 * Method name		: exportPDFNhanHC
	 * Return type		: void
	 * Description		:
	 * Created date		: Sep 14, 2008
	 * Author			: Ngoc Diem
	 **************************************/
	public void exportPDFNhanHC(){
			this.setError("");    	
			this.FillData();
			List<HienThiThongTin> listData = this.getListData();
			if (listData.size() > 0) {
				ExporToPDF<HienThiThongTin> exportPDF = new ExporToPDF<HienThiThongTin>();
				HashMap<String, String> parameter = new HashMap<String, String>();
				parameter.put("ngaythuhoihc",DateUtils.LayNgayHienTai()+"/"+DateUtils.LayThangHienTai()+"/"+DateUtils.LayNamHienTai());
				parameter.put("sohcthuhoi", this.soHC);
				parameter.put("coquan", this.coQuan);
				exportPDF.exportToPDF("quanlyhochieu_template", "xacnhanthuhoihc",
						"exp_quanlyhochieu", parameter, "nhanhc", listData);
				this.setPathDownload(exportPDF.getPathDownload());
			} else {
				this.setError("Không có dữ liệu !");
			}
		
	}
		
	
	
	public void exportPDFGiaoHC(){
		this.setError("");  	 
			this.FillData();
			List<HienThiThongTin> listData = this.getListData();
			if (listData.size() > 0) {
				ExporToPDF<HienThiThongTin> exportPDF = new ExporToPDF<HienThiThongTin>();
				HashMap<String, String> parameter = new HashMap<String, String>();
				parameter.put("sohcnhanve", this.soHC);
				parameter.put("ngaynhan", DateUtils.LayNgayHienTai()+"/"+DateUtils.LayThangHienTai()+"/"+DateUtils.LayNamHienTai());
				String ngayHetHan  =DateUtils.layNgayHetHan(this.strNgayVe);
				parameter.put("ngayquydinhnop",DateUtils.formatDate(ngayHetHan));
				parameter.put("ngaytrahc", DateUtils.formatDate(ngayHetHan));
				exportPDF.exportToPDF("quanlyhochieu_template", "biennhanhc",
				"exp_quanlyhochieu", parameter, "giaohc",listData);				
				this.setPathDownload(exportPDF.getPathDownload());
		} 
			else {
			this.setError("Không có dữ liệu !");
		}
  }
	public String displayInforQD(){
		if(this.thaoTac != null && !this.thaoTac.equals("")){
			if(this.thaoTac.equals("G")){
			this.setState(false);
			this.setError("");
			}
			else {
				this.setState(true);
				this.resetDataQuyetDinh();
				this.soQD = null;				
				this.setError("");
			}
			}
		
		return "giao_hochieu";
	}

	public String huyBo(){
		this.resetDataHoChieu();
		this.soHC = null;		
		this.resetDataQuyetDinh();
		this.soQD = null;
		this.setError("");
		return "giao_hochieu";
	}
	public String getMaDoan() {
		return maDoan;
	}
	public void setMaDoan(String maDoan) {
		this.maDoan = maDoan;
	}

	public String getStrNgayDi() {
		return strNgayDi;
	}

	public void setStrNgayDi(String strNgayDi) {
		this.strNgayDi = strNgayDi;
	}

	public String getStrNgayVe() {
		return strNgayVe;
	}

	public void setStrNgayVe(String strNgayVe) {
		this.strNgayVe = strNgayVe;
	}

	public String getLinkdownload() {
		return linkdownload;
	}

	public void setLinkdownload(String linkdownload) {
		this.linkdownload = linkdownload;
	}
	public String trove(){
		this.resetDataHoChieu();
		this.resetDataQuyetDinh();
		this.soHC = null;
		this.soQD = null;
		this.setError("");
		return "trove";
	}
		
}
